package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年12月20日
 * @description ：
 * @version: 1.0
 */
@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    /**
     * 添加
     * @param category
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("添加的分类信息:{}",category);
        // category 少id 少创建时间更新时间创建人 修改人
        //            id 自动生成
        //   创建时间更新时间创建人 修改人 公共填充方式 不用写
        //保存到数据库
        categoryService.save(category);

        return R.success("新增分类成功");
    }

    /**
     * 分页查询
     */
    @GetMapping("/page")
    public R<Page> page(int page,int pageSize){
        //1: 构建分页构造器 page对象
        Page<Category> pageInfo = new Page<>(page,pageSize);
        //2: 构建条件构造器 queryWrapper
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        //3: 构建条件 注意 潜规则的条件
        // 如果有排序字段 查询要按照排序字段进行展示
        //  如果没有 有没有更新字段 按照更新字段降序排
        wrapper.orderByAsc(Category::getSort);//排序字段升序
        //4: 执行分页查询语句
        categoryService.page(pageInfo,wrapper);
        //5: 返回 page对象
        return R.success(pageInfo);
    }


    @DeleteMapping
    public R<String> deleteById(Long id){
        log.info("根据id删除分类信息:"+id);
        //执行删除
        /*
        // 根据 ID 删除
   boolean removeById(Serializable id);
         */
        // 直接删除不合适 修改业务
        //categoryService.removeById(id);
        categoryService.remove(id);//我自己写一个方法 解决删除业务

        return R.success("该分类信息完成了删除");
    }


    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("修改的分类信息:{}",category);
        //调用根据id更新
        categoryService.updateById(category);

        return R.success("修改成功");
    }

//    @GetMapping
//    public R<List> list(Integer type){
//    }
//    public R<List> list(String name){
//    }
    /**
     *   用对象形式接收 复用性高于上面
     *      上面方法 只能接收 type属性
     *      下面方法  只要是 category的属性 都能接收
     *             提高扩展性  不一定用的到
     *       格局打开
     *
     * @param category
     * @return
     */
    @GetMapping("/list")
    public R<List> list(Category category){//category包含type属性
        log.info("查询条件:"+category);
        // 根据条件查询
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();

        // where type=1
       // wrapper.eq(Category::getType,category.getType());
        //mp还有更规范的开发
        wrapper.eq(category.getType()!=null,Category::getType,category.getType());
        // 先去判断参数有没有  有的就拼接 <where><if>
//        wrapper.like(category.getName()!=null,Category::getName,category.getName())
        wrapper.orderByAsc(Category::getSort);//潜规则 按照排序字段
        // 执行语句
        List<Category> categories = categoryService.list(wrapper);

        return R.success(categories);


    }
}
